import axios from 'axios'
import store from '@/store'
import router from '@/router'
// 封装一个 axios 实例, 其实就是创建并配置一个新的 axios 实例。
// 这里要做创建 axios 实例 后，进行合理配置，以满足当前程序，而不能使用模式axios 实例。
// 因为使用默认axios 实例的话，在发请求时，对axios实例的修改，会影响所有后续情绪。
// 发送ajax请求时，要么每次都创建一个 axios实例，进行个性话配置，
// 要么配置好一个通用的，每次发送 ajax请求都用这个 axios 请求。

// 1、初始化一个 axios 实例
//     （不能使用 默认的 axios 实例，因为直接使用默认的axios 实例，修改配置时，会影响所有的请求发送）
// 2、请求拦截器：设置token
// 3、响应拦截器： 结构响应数据，失败时，清除token
// 4、定义一个函数： 使用配置好的这个 axios 实例 发送请求，返回值为 Promise

// 有些请求不是使用 这个 axios实例发送请求的，但 baseURL地址还是这个，例如文件上传
export const baseURL = 'http://localhost:8085/'
const instance = axios.create({
    baseURL,
    timeout: 5000
})
//
instance.interceptors.request.use(config => {
    // 配置 当前 axios 实例的参数
    // 1、如果本地有 token，就在 Header 中携带 token
    // const profile = store.state.user.profile
    const { profile } = store.state.user
    if (profile.token) {
        config.headers.Authorization = `Bearer ${profile.token}`
    }
    // 最后一定要返回这个配置数据
    return config
}, err => {
    return Promise.reject(err)
})
//
instance.interceptors.response.use(res => {
    return res.data
}, err => {
    if (err.response && err.response.status === 401) {
        // 1、因为当前用户信息已经无效了，所有需要清除
        // 2、跳转到登录页并携带上当前路由url，因为登录成功后，还要返回当前页
        // 3
        store.commit('user/setProfile', {})
        const fullPath = encodeURIComponent(router.currentRoute.value.fullPath)
        router.push('/login?redirectUrl=' + fullPath)
    }
    return Promise.reject(err)
})
// 导出 创建并配置好的 axios 实例，用于发起 ajax请求
export default (url, method, requestData) => {
    return instance({
        url,
        method,
        [method.toLowerCase() === 'get' ? 'params' : 'data']: requestData
    })
}
